package com.easyapi.common.utils;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

public class SqlOperatorValidator {

    // 定义支持的字段类型和对应合法操作符的映射
    private static final Map<String, Set<String>> typeOperatorMap = new HashMap<>();

    static {
        // 数字类型的合法操作符
        Set<String> numericOperators = new HashSet<>();
        numericOperators.add("=");
        numericOperators.add("!=");
        numericOperators.add("<");
        numericOperators.add(">");
        numericOperators.add("<=");
        numericOperators.add(">=");

        // 字符串类型的合法操作符
        Set<String> stringOperators = new HashSet<>();
        stringOperators.add("=");
        stringOperators.add("!=");
        stringOperators.add("LIKE");

        // 日期类型的合法操作符
        Set<String> dateOperators = new HashSet<>();
        dateOperators.add("=");
        dateOperators.add("!=");
        dateOperators.add("<");
        dateOperators.add(">");
        dateOperators.add("<=");
        dateOperators.add(">=");

        // 布尔类型的合法操作符
        Set<String> booleanOperators = new HashSet<>();
        booleanOperators.add("=");
        booleanOperators.add("!=");

        // 在映射中加入字段类型对应的操作符集合
        typeOperatorMap.put("INT", numericOperators);
        typeOperatorMap.put("BIGINT", numericOperators);
        typeOperatorMap.put("FLOAT", numericOperators);
        typeOperatorMap.put("DOUBLE", numericOperators);
        typeOperatorMap.put("DECIMAL", numericOperators);

        typeOperatorMap.put("VARCHAR", stringOperators);
        typeOperatorMap.put("TEXT", stringOperators);
        typeOperatorMap.put("CHAR", stringOperators);

        typeOperatorMap.put("DATE", dateOperators);
        typeOperatorMap.put("DATETIME", dateOperators);
        typeOperatorMap.put("TIMESTAMP", dateOperators);

        typeOperatorMap.put("BOOLEAN", booleanOperators);
    }

    /**
     * 判断传入的字段类型和操作符是否合法
     *
     * @param fieldType   MySQL 字段类型（如 INT, VARCHAR, DATE 等）
     * @param operator    操作符（如 =, <, >, LIKE 等）
     * @return 如果操作符合法则返回 true，否则返回 false
     */
    public static boolean isValidOperator(String fieldType, String operator) {
        // 将字段类型标准化为大写字母
        fieldType = fieldType.toUpperCase();

        // 获取对应字段类型的操作符集合
        Set<String> validOperators = typeOperatorMap.get(fieldType);

        // 如果字段类型存在，且操作符在合法集合中，则返回 true
        if (validOperators != null && validOperators.contains(operator.toUpperCase())) {
            return true;
        }

        // 如果不合法，返回 false
        return false;
    }
}
